簡單敘述 .NET CLR中的實值型別與參考型別
先來看一段引述自MSDN文件庫 http://msdn.microsoft.com/zh-tw/library/2hf02550.aspx一般型別系統概觀 關於型別的說法:
**一般型別系統可支援兩個一般類別的型別,每一個類別又可細分為多個子類別:
實值型別
實值型別直接包含資料,而且實值型別的執行個體 (Instance) 不是在堆疊上配置,就是在結構中內嵌 (Inline) 配置。實值型別可為內建 (由執行階段實作)、使用者定義或列舉型別 (Enumeration)。如需內建實值型別的清單,請參閱 .NET Framework 類別庫。
參考型別
參考型別 (Reference Type) 會儲存變數記憶體位址的參考,並且在堆積 (Heap) 上配置。參考型別可為自我描述型別、指標型別 (Pointer Type) 或介面型別 (Interface Type)。參考型別的型別可從自我描述型別的值判斷出來。自我描述型別可再分為陣列和類別型別。類別型別包括使用者定義型別、Boxed 實值型別和委派。
實值型別的變數都各擁有自己的資料複本,因此對其中一個變數進行的作業並不會影響其他變數。參考型別的變數可參考相同的物件,因此對其中一個變數進行的作業可能會影響其他變數所參考的相同物件。**
其實MSDN說的很明白,但很多人依舊看的很模糊,尤其是最後那一段。我們通常會在型別系統犯的錯多半出在對於參考型別的不瞭解,尤其是用參考型別當參數傳遞到另一個方法的時候。
一般參數傳遞有使用傳址(By Reference,也有人稱為By Address)或傳值(By Value),當使用參考型別用傳值的方法傳遞參數時要記得一件很重要的事情,此時並不是傳遞一份複本過去 (使用實值型別做傳值傳遞時,CLR會將你原本要傳的變數複製一份在不同的記憶體空間,這種行為就是傳遞複本),事實上它是將該參考型別執行個體的記憶體參考位置傳過去,也就是說此時在兩個分開方法中所指向的都是同一個執行個體,你在任何一個方法中對它動手動腳都會影響到另一個方法。
這~會錯,就該打屁股了.
這是不是非常基礎的嗎?
大學基礎課程(我沒讀大學不清楚)不是都會教?
這種題目,我去面試N次中,只考過一次.
但在升學或國考中,這是非常重要的,常常考.
說真的, 搞不清楚的人還真非常多.
程式書每本幾乎都會提一次,我的 C++ 和 Java 都有描述意小章節, VB 好像沒印象....
很多書都會寫沒錯, 不過我想很多人可能也都跳過那個章節就開始寫 Hello World之類的